🎖️GitЯра🎖️
examples/simple_repeater/main.cpp 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 5.32 KB
Tff7b72#Tff7b72include T8b949e<Arduino.h> T8b949e// needed for PlatformIO
Tff7b72#Tff7b72include T8b949e<Mesh.h>
Tff7b72#Tff7b72include T8b949e"MyMesh.h"
Tff7b72#Tff7b72ifdef DISPLAY_CLASS
Tff7b72#Tff7b72include T8b949e"UITask.h"
Tff7b72static Te6edf3UITask Td2a8ffui_taskTb4b4b4(Te6edf3boardTb4b4b4, Te6edf3displayTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ETHERNET_ENABLED
Tff7b72#Tff7b72define ETHERNET_CLI_BANNER "MeshCore Repeater CLI"
Tff7b72#Tff7b72include T8b949e<helpers/nrf52/EthernetCLI.h>
Tff7b72#Tff7b72endif
Te6edf3StdRNG Te6edf3fast_rngTb4b4b4;
Te6edf3SimpleMeshTables Te6edf3tablesTb4b4b4;
Te6edf3MyMesh Td2a8ffthe_meshTb4b4b4(Te6edf3boardTb4b4b4, Te6edf3radio_driverTb4b4b4, Tff7b72*Tff7b72new Te6edf3ArduinoMillisTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3fast_rngTb4b4b4, Te6edf3rtc_clockTb4b4b4, Te6edf3tablesTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffhaltTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72while Tb4b4b4(T79c0ff1Tb4b4b4) Tb4b4b4;
Tb4b4b4}
Tff7b72static Tffa657char Te6edf3commandTb4b4b4[T79c0ff160Tb4b4b4]Tb4b4b4;
Tff7b72#Tff7b72ifdef ETHERNET_ENABLED
Tff7b72static Tffa657char Te6edf3ethernet_commandTb4b4b4[T79c0ff160Tb4b4b4]Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// For power saving
Tffa657unsigned Tffa657long Te6edf3POWERSAVING_FIRSTSLEEP_SECS Tff7b72= T79c0ff120Tb4b4b4; T8b949e// The first sleep (if enabled) from boot
Tff7b72#Tff7b72if defined(PIN_USER_BTN) && defined(_SEEED_SENSECAP_SOLAR_H_)
Tff7b72static Tffa657unsigned Tffa657long Te6edf3userBtnDownAt Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72define USER_BTN_HOLD_OFF_MILLIS 1500
Tff7b72#Tff7b72endif
Tffa657void Td2a8ffsetupTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3beginTb4b4b4(T79c0ff115200Tb4b4b4)Tb4b4b4;
Te6edf3delayTb4b4b4(T79c0ff1000Tb4b4b4)Tb4b4b4;
Te6edf3boardTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef HAS_EXTERNAL_WATCHDOG
Te6edf3external_watchdogTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if defined(MESH_DEBUG) && defined(NRF52_PLATFORM)
T8b949e// give some extra time for serial to settle so
T8b949e// boot debug messages can be seen on terminal
Te6edf3delayTb4b4b4(T79c0ff5000Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef DISPLAY_CLASS
Tff7b72if Tb4b4b4(Te6edf3displayTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3displayTb4b4b4.Te6edf3startFrameTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3displayTb4b4b4.Te6edf3setCursorTb4b4b4(T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3displayTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ffPlease wait...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3displayTb4b4b4.Te6edf3endFrameTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3radio_initTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffRadio init failed!Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3haltTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3fast_rngTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3radio_driverTb4b4b4.Te6edf3getRngSeedTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3FILESYSTEMTff7b72* Te6edf3fsTb4b4b4;
Tff7b72#Tff7b72if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
Te6edf3InternalFSTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3fs Tff7b72= Tff7b72&Te6edf3InternalFSTb4b4b4;
Te6edf3IdentityStore Te6edf3storeTb4b4b4(Te6edf3InternalFSTb4b4b4, Ta5d6ff"Ta5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(ESP32)
Te6edf3SPIFFSTb4b4b4.Te6edf3beginTb4b4b4(Tffa657trueTb4b4b4)Tb4b4b4;
Te6edf3fs Tff7b72= Tff7b72&Te6edf3SPIFFSTb4b4b4;
Te6edf3IdentityStore Te6edf3storeTb4b4b4(Te6edf3SPIFFSTb4b4b4, Ta5d6ff"Ta5d6ff/identityTa5d6ff"Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72elif defined(RP2040_PLATFORM)
Te6edf3LittleFSTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3fs Tff7b72= Tff7b72&Te6edf3LittleFSTb4b4b4;
Te6edf3IdentityStore Te6edf3storeTb4b4b4(Te6edf3LittleFSTb4b4b4, Ta5d6ff"Ta5d6ff/identityTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3storeTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72else
Tff7b72#Tff7b72error "need to define filesystem"
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3storeTb4b4b4.Te6edf3loadTb4b4b4(Ta5d6ff"Ta5d6ff_mainTa5d6ff"Tb4b4b4, Te6edf3the_meshTb4b4b4.Te6edf3self_idTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3MESH_DEBUG_PRINTLNTb4b4b4(Ta5d6ff"Ta5d6ffGenerating new keypairTa5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3the_meshTb4b4b4.Te6edf3self_id Tff7b72= Te6edf3radio_new_identityTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// create new random identity
Tffa657int Te6edf3count Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3count Tff7b72< T79c0ff10 Tff7b72&Tff7b72& Tb4b4b4(Te6edf3the_meshTb4b4b4.Te6edf3self_idTb4b4b4.Te6edf3pub_keyTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=Tff7b72= T79c0ff0x00 Tff7b72|Tff7b72| Te6edf3the_meshTb4b4b4.Te6edf3self_idTb4b4b4.Te6edf3pub_keyTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72=Tff7b72= T79c0ff0xFFTb4b4b4)Tb4b4b4) Tb4b4b4{ T8b949e// reserved id hashes
Te6edf3the_meshTb4b4b4.Te6edf3self_id Tff7b72= Te6edf3radio_new_identityTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3countTff7b72+Tff7b72+Tb4b4b4;
Tb4b4b4}
Te6edf3storeTb4b4b4.Te6edf3saveTb4b4b4(Ta5d6ff"Ta5d6ff_mainTa5d6ff"Tb4b4b4, Te6edf3the_meshTb4b4b4.Te6edf3self_idTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ffRepeater ID: Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3UtilsTff7b72:Tff7b72:Te6edf3printHexTb4b4b4(Te6edf3SerialTb4b4b4, Te6edf3the_meshTb4b4b4.Te6edf3self_idTb4b4b4.Te6edf3pub_keyTb4b4b4, Te6edf3PUB_KEY_SIZETb4b4b4)Tb4b4b4; Te6edf3SerialTb4b4b4.Te6edf3printlnTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3commandTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72ifdef ETHERNET_ENABLED
Te6edf3ethernet_commandTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3sensorsTb4b4b4.Te6edf3beginTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3the_meshTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3fsTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef DISPLAY_CLASS
Te6edf3ui_taskTb4b4b4.Te6edf3beginTb4b4b4(Te6edf3the_meshTb4b4b4.Te6edf3getNodePrefsTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3FIRMWARE_BUILD_DATETb4b4b4, Te6edf3FIRMWARE_VERSIONTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72ifdef ETHERNET_ENABLED
Te6edf3ethernet_start_taskTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
T8b949e// send out initial zero hop Advertisement to the mesh
Tff7b72#Tff7b72if ENABLE_ADVERT_ON_BOOT == 1
Te6edf3the_meshTb4b4b4.Te6edf3sendSelfAdvertisementTb4b4b4(T79c0ff16000Tb4b4b4, Tffa657falseTb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3boardTb4b4b4.Te6edf3onBootCompleteTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Td2a8ffloopTb4b4b4(Tb4b4b4) Tb4b4b4{
T8b949e// Handle Serial CLI
Tffa657int Te6edf3len Tff7b72= Te6edf3strlenTb4b4b4(Te6edf3commandTb4b4b4)Tb4b4b4;
Tff7b72while Tb4b4b4(Te6edf3SerialTb4b4b4.Te6edf3availableTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3len Tff7b72< Tff7b72sizeofTb4b4b4(Te6edf3commandTb4b4b4)T79c0ff-1Tb4b4b4) Tb4b4b4{
Tffa657char Te6edf3c Tff7b72= Te6edf3SerialTb4b4b4.Te6edf3readTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3c Tff7b72!Tff7b72= Ta5d6ff'Ta5d6ff\nTa5d6ff'Tb4b4b4) Tb4b4b4{
Te6edf3commandTb4b4b4[Te6edf3lenTff7b72+Tff7b72+Tb4b4b4] Tff7b72= Te6edf3cTb4b4b4;
Te6edf3commandTb4b4b4[Te6edf3lenTb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Te6edf3cTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3c Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\rTa5d6ff'Tb4b4b4) Tff7b72breakTb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72=Tff7b72= Tff7b72sizeofTb4b4b4(Te6edf3commandTb4b4b4)T79c0ff-1Tb4b4b4) Tb4b4b4{ T8b949e// command buffer full
Te6edf3commandTb4b4b4[Tff7b72sizeofTb4b4b4(Te6edf3commandTb4b4b4)T79c0ff-1Tb4b4b4] Tff7b72= Ta5d6ff'Ta5d6ff\rTa5d6ff'Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3len Tff7b72> T79c0ff0 Tff7b72&Tff7b72& Te6edf3commandTb4b4b4[Te6edf3len Tff7b72- T79c0ff1Tb4b4b4] Tff7b72=Tff7b72= Ta5d6ff'Ta5d6ff\rTa5d6ff'Tb4b4b4) Tb4b4b4{ T8b949e// received complete line
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff'Ta5d6ff\nTa5d6ff'Tb4b4b4)Tb4b4b4;
Te6edf3commandTb4b4b4[Te6edf3len Tff7b72- T79c0ff1Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4; T8b949e// replace newline with C string null terminator
Tffa657char Te6edf3replyTb4b4b4[T79c0ff160Tb4b4b4]Tb4b4b4;
Te6edf3replyTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72ifdef ETHERNET_ENABLED
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ethernet_handle_commandTb4b4b4(Te6edf3commandTb4b4b4, Te6edf3replyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3the_meshTb4b4b4.Te6edf3handleCommandTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3commandTb4b4b4, Te6edf3replyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72else
Te6edf3the_meshTb4b4b4.Te6edf3handleCommandTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3commandTb4b4b4, Te6edf3replyTb4b4b4)Tb4b4b4; T8b949e// NOTE: there is no sender_timestamp via serial!
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3replyTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4) Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printTb4b4b4(Ta5d6ff"Ta5d6ff -> Ta5d6ff"Tb4b4b4)Tb4b4b4; Te6edf3SerialTb4b4b4.Te6edf3printlnTb4b4b4(Te6edf3replyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3commandTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4; T8b949e// reset command buffer
Tb4b4b4}
Tff7b72#Tff7b72ifdef ETHERNET_ENABLED
Te6edf3ethernet_loop_maintainTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3ethernet_read_lineTb4b4b4(Te6edf3ethernet_commandTb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3ethernet_commandTb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tffa657char Te6edf3replyTb4b4b4[T79c0ff160Tb4b4b4]Tb4b4b4;
Te6edf3replyTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ethernet_handle_commandTb4b4b4(Te6edf3ethernet_commandTb4b4b4, Te6edf3replyTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3the_meshTb4b4b4.Te6edf3handleCommandTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3ethernet_commandTb4b4b4, Te6edf3replyTb4b4b4)Tb4b4b4;
Tb4b4b4}
Te6edf3ethernet_send_replyTb4b4b4(Te6edf3replyTb4b4b4)Tb4b4b4;
Te6edf3ethernet_commandTb4b4b4[T79c0ff0Tb4b4b4] Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72if defined(PIN_USER_BTN) && defined(_SEEED_SENSECAP_SOLAR_H_) && !defined(DISPLAY_CLASS)
T8b949e// Hold the user button to power off the SenseCAP Solar repeater.
Tffa657int Te6edf3btnState Tff7b72= Te6edf3digitalReadTb4b4b4(Te6edf3PIN_USER_BTNTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3btnState Tff7b72=Tff7b72= Te6edf3LOWTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3userBtnDownAt Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3userBtnDownAt Tff7b72= Te6edf3millisTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Tb4b4b4(Tffa657unsigned Tffa657longTb4b4b4)Tb4b4b4(Te6edf3millisTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3userBtnDownAtTb4b4b4) Tff7b72>Tff7b72= Te6edf3USER_BTN_HOLD_OFF_MILLISTb4b4b4) Tb4b4b4{
Te6edf3SerialTb4b4b4.Te6edf3printlnTb4b4b4(Ta5d6ff"Ta5d6ffPowering off...Ta5d6ff"Tb4b4b4)Tb4b4b4;
Te6edf3boardTb4b4b4.Te6edf3powerOffTb4b4b4(Tb4b4b4)Tb4b4b4; T8b949e// does not return
Tb4b4b4}
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3userBtnDownAt Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}
Tff7b72#Tff7b72endif
Te6edf3the_meshTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3sensorsTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef DISPLAY_CLASS
Te6edf3ui_taskTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3rtc_clockTb4b4b4.Te6edf3tickTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef HAS_EXTERNAL_WATCHDOG
Te6edf3external_watchdogTb4b4b4.Te6edf3loopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72endif
Tff7b72if Tb4b4b4(Te6edf3the_meshTb4b4b4.Te6edf3getNodePrefsTb4b4b4(Tb4b4b4)Tff7b72-Tff7b72>Te6edf3powersaving_enabled Tff7b72&Tff7b72& Tff7b72!Te6edf3the_meshTb4b4b4.Te6edf3hasPendingWorkTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72#Tff7b72if defined(NRF52_PLATFORM)
Te6edf3boardTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff0Tb4b4b4)Tb4b4b4; T8b949e// nrf ignores seconds param, sleeps whenever possible
Tff7b72#Tff7b72else
Tff7b72if Tb4b4b4(Te6edf3the_meshTb4b4b4.Te6edf3millisHasNowPassedTb4b4b4(Te6edf3POWERSAVING_FIRSTSLEEP_SECS Tff7b72* T79c0ff1000Tb4b4b4)Tb4b4b4) Tb4b4b4{ T8b949e// To check if it is time to sleep
Te6edf3boardTb4b4b4.Te6edf3sleepTb4b4b4(T79c0ff30Tb4b4b4)Tb4b4b4; T8b949e// Sleep. Wake up after a while or when receiving a LoRa packet
Tb4b4b4}
Tff7b72#Tff7b72endif
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.2 - Generated in 0.23s